<?php
/**
 * Pinyin class file.
 *
 * @author         RcPHP Dev Team
 * @copyright      Copyright (c) 2013,RcPHP Dev Team
 * @license        Apache License 2.0 {@link http://www.apache.org/licenses/LICENSE-2.0}
 * @package        Util
 * @since          1.0
 * @filesource
 */
namespace RCPHP\Util;

defined('IN_RCPHP') or exit('Access denied');

class Pinyin
{

	/**
	 * 汉字ASCII码库
	 *
	 * @var array
	 */
	protected $lib;

	/**
	 * 构造函数
	 *
	 * @return void
	 */
	public function __construct()
	{
	}

	/**
	 * 将ASCII编码转化为字符串
	 *
	 * @param int $num
	 * @return string
	 */
	protected function num2str($num)
	{

		if(!$this->lib)
		{
			$this->parseLib();
		}

		if($num > 0 && $num < 160)
		{

			return chr($num);
		}
		elseif($num < -20319 || $num > -10247)
		{

			return '';
		}
		else
		{
			$total = sizeof($this->lib) - 1;
			for($i = $total; $i >= 0; $i--)
			{
				if($this->lib[$i][1] <= $num)
				{
					break;
				}
			}

			return $this->lib[$i][0];
		}
	}

	/**
	 * 返回汉字编码库
	 *
	 * @return array
	 */
	protected function parseLib()
	{

		return $this->lib = array(
			array(
				"a",
				-20319
			),
			array(
				"ai",
				-20317
			),
			array(
				"an",
				-20304
			),
			array(
				"ang",
				-20295
			),
			array(
				"ao",
				-20292
			),
			array(
				"ba",
				-20283
			),
			array(
				"bai",
				-20265
			),
			array(
				"ban",
				-20257
			),
			array(
				"bang",
				-20242
			),
			array(
				"bao",
				-20230
			),
			array(
				"bei",
				-20051
			),
			array(
				"ben",
				-20036
			),
			array(
				"beng",
				-20032
			),
			array(
				"bi",
				-20026
			),
			array(
				"bian",
				-20002
			),
			array(
				"biao",
				-19990
			),
			array(
				"bie",
				-19986
			),
			array(
				"bin",
				-19982
			),
			array(
				"bing",
				-19976
			),
			array(
				"bo",
				-19805
			),
			array(
				"bu",
				-19784
			),
			array(
				"ca",
				-19775
			),
			array(
				"cai",
				-19774
			),
			array(
				"can",
				-19763
			),
			array(
				"cang",
				-19756
			),
			array(
				"cao",
				-19751
			),
			array(
				"ce",
				-19746
			),
			array(
				"ceng",
				-19741
			),
			array(
				"cha",
				-19739
			),
			array(
				"chai",
				-19728
			),
			array(
				"chan",
				-19725
			),
			array(
				"chang",
				-19715
			),
			array(
				"chao",
				-19540
			),
			array(
				"che",
				-19531
			),
			array(
				"chen",
				-19525
			),
			array(
				"cheng",
				-19515
			),
			array(
				"chi",
				-19500
			),
			array(
				"chong",
				-19484
			),
			array(
				"chou",
				-19479
			),
			array(
				"chu",
				-19467
			),
			array(
				"chuai",
				-19289
			),
			array(
				"chuan",
				-19288
			),
			array(
				"chuang",
				-19281
			),
			array(
				"chui",
				-19275
			),
			array(
				"chun",
				-19270
			),
			array(
				"chuo",
				-19263
			),
			array(
				"ci",
				-19261
			),
			array(
				"cong",
				-19249
			),
			array(
				"cou",
				-19243
			),
			array(
				"cu",
				-19242
			),
			array(
				"cuan",
				-19238
			),
			array(
				"cui",
				-19235
			),
			array(
				"cun",
				-19227
			),
			array(
				"cuo",
				-19224
			),
			array(
				"da",
				-19218
			),
			array(
				"dai",
				-19212
			),
			array(
				"dan",
				-19038
			),
			array(
				"dang",
				-19023
			),
			array(
				"dao",
				-19018
			),
			array(
				"de",
				-19006
			),
			array(
				"deng",
				-19003
			),
			array(
				"di",
				-18996
			),
			array(
				"dian",
				-18977
			),
			array(
				"diao",
				-18961
			),
			array(
				"die",
				-18952
			),
			array(
				"ding",
				-18783
			),
			array(
				"diu",
				-18774
			),
			array(
				"dong",
				-18773
			),
			array(
				"dou",
				-18763
			),
			array(
				"du",
				-18756
			),
			array(
				"duan",
				-18741
			),
			array(
				"dui",
				-18735
			),
			array(
				"dun",
				-18731
			),
			array(
				"duo",
				-18722
			),
			array(
				"e",
				-18710
			),
			array(
				"en",
				-18697
			),
			array(
				"er",
				-18696
			),
			array(
				"fa",
				-18526
			),
			array(
				"fan",
				-18518
			),
			array(
				"fang",
				-18501
			),
			array(
				"fei",
				-18490
			),
			array(
				"fen",
				-18478
			),
			array(
				"feng",
				-18463
			),
			array(
				"fo",
				-18448
			),
			array(
				"fou",
				-18447
			),
			array(
				"fu",
				-18446
			),
			array(
				"ga",
				-18239
			),
			array(
				"gai",
				-18237
			),
			array(
				"gan",
				-18231
			),
			array(
				"gang",
				-18220
			),
			array(
				"gao",
				-18211
			),
			array(
				"ge",
				-18201
			),
			array(
				"gei",
				-18184
			),
			array(
				"gen",
				-18183
			),
			array(
				"geng",
				-18181
			),
			array(
				"gong",
				-18012
			),
			array(
				"gou",
				-17997
			),
			array(
				"gu",
				-17988
			),
			array(
				"gua",
				-17970
			),
			array(
				"guai",
				-17964
			),
			array(
				"guan",
				-17961
			),
			array(
				"guang",
				-17950
			),
			array(
				"gui",
				-17947
			),
			array(
				"gun",
				-17931
			),
			array(
				"guo",
				-17928
			),
			array(
				"ha",
				-17922
			),
			array(
				"hai",
				-17759
			),
			array(
				"han",
				-17752
			),
			array(
				"hang",
				-17733
			),
			array(
				"hao",
				-17730
			),
			array(
				"he",
				-17721
			),
			array(
				"hei",
				-17703
			),
			array(
				"hen",
				-17701
			),
			array(
				"heng",
				-17697
			),
			array(
				"hong",
				-17692
			),
			array(
				"hou",
				-17683
			),
			array(
				"hu",
				-17676
			),
			array(
				"hua",
				-17496
			),
			array(
				"huai",
				-17487
			),
			array(
				"huan",
				-17482
			),
			array(
				"huang",
				-17468
			),
			array(
				"hui",
				-17454
			),
			array(
				"hun",
				-17433
			),
			array(
				"huo",
				-17427
			),
			array(
				"ji",
				-17417
			),
			array(
				"jia",
				-17202
			),
			array(
				"jian",
				-17185
			),
			array(
				"jiang",
				-16983
			),
			array(
				"jiao",
				-16970
			),
			array(
				"jie",
				-16942
			),
			array(
				"jin",
				-16915
			),
			array(
				"jing",
				-16733
			),
			array(
				"jiong",
				-16708
			),
			array(
				"jiu",
				-16706
			),
			array(
				"ju",
				-16689
			),
			array(
				"juan",
				-16664
			),
			array(
				"jue",
				-16657
			),
			array(
				"jun",
				-16647
			),
			array(
				"ka",
				-16474
			),
			array(
				"kai",
				-16470
			),
			array(
				"kan",
				-16465
			),
			array(
				"kang",
				-16459
			),
			array(
				"kao",
				-16452
			),
			array(
				"ke",
				-16448
			),
			array(
				"ken",
				-16433
			),
			array(
				"keng",
				-16429
			),
			array(
				"kong",
				-16427
			),
			array(
				"kou",
				-16423
			),
			array(
				"ku",
				-16419
			),
			array(
				"kua",
				-16412
			),
			array(
				"kuai",
				-16407
			),
			array(
				"kuan",
				-16403
			),
			array(
				"kuang",
				-16401
			),
			array(
				"kui",
				-16393
			),
			array(
				"kun",
				-16220
			),
			array(
				"kuo",
				-16216
			),
			array(
				"la",
				-16212
			),
			array(
				"lai",
				-16205
			),
			array(
				"lan",
				-16202
			),
			array(
				"lang",
				-16187
			),
			array(
				"lao",
				-16180
			),
			array(
				"le",
				-16171
			),
			array(
				"lei",
				-16169
			),
			array(
				"leng",
				-16158
			),
			array(
				"li",
				-16155
			),
			array(
				"lia",
				-15959
			),
			array(
				"lian",
				-15958
			),
			array(
				"liang",
				-15944
			),
			array(
				"liao",
				-15933
			),
			array(
				"lie",
				-15920
			),
			array(
				"lin",
				-15915
			),
			array(
				"ling",
				-15903
			),
			array(
				"liu",
				-15889
			),
			array(
				"long",
				-15878
			),
			array(
				"lou",
				-15707
			),
			array(
				"lu",
				-15701
			),
			array(
				"lv",
				-15681
			),
			array(
				"luan",
				-15667
			),
			array(
				"lue",
				-15661
			),
			array(
				"lun",
				-15659
			),
			array(
				"luo",
				-15652
			),
			array(
				"ma",
				-15640
			),
			array(
				"mai",
				-15631
			),
			array(
				"man",
				-15625
			),
			array(
				"mang",
				-15454
			),
			array(
				"mao",
				-15448
			),
			array(
				"me",
				-15436
			),
			array(
				"mei",
				-15435
			),
			array(
				"men",
				-15419
			),
			array(
				"meng",
				-15416
			),
			array(
				"mi",
				-15408
			),
			array(
				"mian",
				-15394
			),
			array(
				"miao",
				-15385
			),
			array(
				"mie",
				-15377
			),
			array(
				"min",
				-15375
			),
			array(
				"ming",
				-15369
			),
			array(
				"miu",
				-15363
			),
			array(
				"mo",
				-15362
			),
			array(
				"mou",
				-15183
			),
			array(
				"mu",
				-15180
			),
			array(
				"na",
				-15165
			),
			array(
				"nai",
				-15158
			),
			array(
				"nan",
				-15153
			),
			array(
				"nang",
				-15150
			),
			array(
				"nao",
				-15149
			),
			array(
				"ne",
				-15144
			),
			array(
				"nei",
				-15143
			),
			array(
				"nen",
				-15141
			),
			array(
				"neng",
				-15140
			),
			array(
				"ni",
				-15139
			),
			array(
				"nian",
				-15128
			),
			array(
				"niang",
				-15121
			),
			array(
				"niao",
				-15119
			),
			array(
				"nie",
				-15117
			),
			array(
				"nin",
				-15110
			),
			array(
				"ning",
				-15109
			),
			array(
				"niu",
				-14941
			),
			array(
				"nong",
				-14937
			),
			array(
				"nu",
				-14933
			),
			array(
				"nv",
				-14930
			),
			array(
				"nuan",
				-14929
			),
			array(
				"nue",
				-14928
			),
			array(
				"nuo",
				-14926
			),
			array(
				"o",
				-14922
			),
			array(
				"ou",
				-14921
			),
			array(
				"pa",
				-14914
			),
			array(
				"pai",
				-14908
			),
			array(
				"pan",
				-14902
			),
			array(
				"pang",
				-14894
			),
			array(
				"pao",
				-14889
			),
			array(
				"pei",
				-14882
			),
			array(
				"pen",
				-14873
			),
			array(
				"peng",
				-14871
			),
			array(
				"pi",
				-14857
			),
			array(
				"pian",
				-14678
			),
			array(
				"piao",
				-14674
			),
			array(
				"pie",
				-14670
			),
			array(
				"pin",
				-14668
			),
			array(
				"ping",
				-14663
			),
			array(
				"po",
				-14654
			),
			array(
				"pu",
				-14645
			),
			array(
				"qi",
				-14630
			),
			array(
				"qia",
				-14594
			),
			array(
				"qian",
				-14429
			),
			array(
				"qiang",
				-14407
			),
			array(
				"qiao",
				-14399
			),
			array(
				"qie",
				-14384
			),
			array(
				"qin",
				-14379
			),
			array(
				"qing",
				-14368
			),
			array(
				"qiong",
				-14355
			),
			array(
				"qiu",
				-14353
			),
			array(
				"qu",
				-14345
			),
			array(
				"quan",
				-14170
			),
			array(
				"que",
				-14159
			),
			array(
				"qun",
				-14151
			),
			array(
				"ran",
				-14149
			),
			array(
				"rang",
				-14145
			),
			array(
				"rao",
				-14140
			),
			array(
				"re",
				-14137
			),
			array(
				"ren",
				-14135
			),
			array(
				"reng",
				-14125
			),
			array(
				"ri",
				-14123
			),
			array(
				"rong",
				-14122
			),
			array(
				"rou",
				-14112
			),
			array(
				"ru",
				-14109
			),
			array(
				"ruan",
				-14099
			),
			array(
				"rui",
				-14097
			),
			array(
				"run",
				-14094
			),
			array(
				"ruo",
				-14092
			),
			array(
				"sa",
				-14090
			),
			array(
				"sai",
				-14087
			),
			array(
				"san",
				-14083
			),
			array(
				"sang",
				-13917
			),
			array(
				"sao",
				-13914
			),
			array(
				"se",
				-13910
			),
			array(
				"sen",
				-13907
			),
			array(
				"seng",
				-13906
			),
			array(
				"sha",
				-13905
			),
			array(
				"shai",
				-13896
			),
			array(
				"shan",
				-13894
			),
			array(
				"shang",
				-13878
			),
			array(
				"shao",
				-13870
			),
			array(
				"she",
				-13859
			),
			array(
				"shen",
				-13847
			),
			array(
				"sheng",
				-13831
			),
			array(
				"shi",
				-13658
			),
			array(
				"shou",
				-13611
			),
			array(
				"shu",
				-13601
			),
			array(
				"shua",
				-13406
			),
			array(
				"shuai",
				-13404
			),
			array(
				"shuan",
				-13400
			),
			array(
				"shuang",
				-13398
			),
			array(
				"shui",
				-13395
			),
			array(
				"shun",
				-13391
			),
			array(
				"shuo",
				-13387
			),
			array(
				"si",
				-13383
			),
			array(
				"song",
				-13367
			),
			array(
				"sou",
				-13359
			),
			array(
				"su",
				-13356
			),
			array(
				"suan",
				-13343
			),
			array(
				"sui",
				-13340
			),
			array(
				"sun",
				-13329
			),
			array(
				"suo",
				-13326
			),
			array(
				"ta",
				-13318
			),
			array(
				"tai",
				-13147
			),
			array(
				"tan",
				-13138
			),
			array(
				"tang",
				-13120
			),
			array(
				"tao",
				-13107
			),
			array(
				"te",
				-13096
			),
			array(
				"teng",
				-13095
			),
			array(
				"ti",
				-13091
			),
			array(
				"tian",
				-13076
			),
			array(
				"tiao",
				-13068
			),
			array(
				"tie",
				-13063
			),
			array(
				"ting",
				-13060
			),
			array(
				"tong",
				-12888
			),
			array(
				"tou",
				-12875
			),
			array(
				"tu",
				-12871
			),
			array(
				"tuan",
				-12860
			),
			array(
				"tui",
				-12858
			),
			array(
				"tun",
				-12852
			),
			array(
				"tuo",
				-12849
			),
			array(
				"wa",
				-12838
			),
			array(
				"wai",
				-12831
			),
			array(
				"wan",
				-12829
			),
			array(
				"wang",
				-12812
			),
			array(
				"wei",
				-12802
			),
			array(
				"wen",
				-12607
			),
			array(
				"weng",
				-12597
			),
			array(
				"wo",
				-12594
			),
			array(
				"wu",
				-12585
			),
			array(
				"xi",
				-12556
			),
			array(
				"xia",
				-12359
			),
			array(
				"xian",
				-12346
			),
			array(
				"xiang",
				-12320
			),
			array(
				"xiao",
				-12300
			),
			array(
				"xie",
				-12120
			),
			array(
				"xin",
				-12099
			),
			array(
				"xing",
				-12089
			),
			array(
				"xiong",
				-12074
			),
			array(
				"xiu",
				-12067
			),
			array(
				"xu",
				-12058
			),
			array(
				"xuan",
				-12039
			),
			array(
				"xue",
				-11867
			),
			array(
				"xun",
				-11861
			),
			array(
				"ya",
				-11847
			),
			array(
				"yan",
				-11831
			),
			array(
				"yang",
				-11798
			),
			array(
				"yao",
				-11781
			),
			array(
				"ye",
				-11604
			),
			array(
				"yi",
				-11589
			),
			array(
				"yin",
				-11536
			),
			array(
				"ying",
				-11358
			),
			array(
				"yo",
				-11340
			),
			array(
				"yo",
				-11340
			),
			array(
				"yong",
				-11339
			),
			array(
				"you",
				-11324
			),
			array(
				"yu",
				-11303
			),
			array(
				"yuan",
				-11097
			),
			array(
				"yue",
				-11077
			),
			array(
				"yun",
				-11067
			),
			array(
				"za",
				-11055
			),
			array(
				"zai",
				-11052
			),
			array(
				"zan",
				-11045
			),
			array(
				"zang",
				-11041
			),
			array(
				"zao",
				-11038
			),
			array(
				"ze",
				-11024
			),
			array(
				"zei",
				-11020
			),
			array(
				"zen",
				-11019
			),
			array(
				"zeng",
				-11018
			),
			array(
				"zha",
				-11014
			),
			array(
				"zhai",
				-10838
			),
			array(
				"zhan",
				-10832
			),
			array(
				"zhang",
				-10815
			),
			array(
				"zhao",
				-10800
			),
			array(
				"zhe",
				-10790
			),
			array(
				"zhen",
				-10780
			),
			array(
				"zheng",
				-10764
			),
			array(
				"zhi",
				-10587
			),
			array(
				"zhong",
				-10544
			),
			array(
				"zhou",
				-10533
			),
			array(
				"zhu",
				-10519
			),
			array(
				"zhua",
				-10331
			),
			array(
				"zhuai",
				-10329
			),
			array(
				"zhuan",
				-10328
			),
			array(
				"zhuang",
				-10322
			),
			array(
				"zhui",
				-10315
			),
			array(
				"zhun",
				-10309
			),
			array(
				"zhuo",
				-10307
			),
			array(
				"zi",
				-10296
			),
			array(
				"zong",
				-10281
			),
			array(
				"zou",
				-10274
			),
			array(
				"zu",
				-10270
			),
			array(
				"zuan",
				-10262
			),
			array(
				"zui",
				-10260
			),
			array(
				"zun",
				-10256
			),
			array(
				"zuo",
				-10254
			)
		);
	}

	/**
	 * 汉字转化并输出拼音
	 *
	 * @param string  $str
	 * @param boolean $utf8
	 * @return string
	 */
	public function output($str, $utf8 = true)
	{

		//参数分析
		if(!$str)
		{
			return false;
		}

		//编码转换.
		$str = ($utf8 == true) ? iconv('utf-8', 'gbk', $str) : $str;
		$num = strlen($str);

		$pinyin = '';
		for($i = 0; $i < $num; $i++)
		{
			$temp = ord(substr($str, $i, 1));
			if($temp > 160)
			{
				$temp2 = ord(substr($str, ++$i, 1));
				$temp = $temp * 256 + $temp2 - 65536;
			}
			$pinyin .= $this->num2str($temp);
		}

		//输出的拼音编码转换.
		return ($utf8 == true) ? iconv('gbk', 'utf-8', $pinyin) : $pinyin;
	}

	/**
	 * 析构函数
	 *
	 * @return void
	 */
	public function __destruct()
	{

		if(isset($this->lib))
		{
			unset($this->lib);
		}
	}
}